home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / mui / bcc_src.lha / Parser / ClassRefCont.cpp < prev    next >
C/C++ Source or Header  |  1998-03-15  |  4KB  |  242 lines

  1. #include "parsefile.h"
  2. #include "global.h"
  3. #include "ClassDef.h"
  4. #include "Replace.h"
  5. #include "MethodDef.h"
  6. #include "VarDef.h"
  7. #include "ParseBC.h"
  8. #include <string.h>
  9.  
  10. short ParseBC::RefCheck( Replace *r )
  11. {
  12.   char *clName, clType[4];
  13.   char *rn;
  14.  
  15.     if( (clName = r->Check( Tok, TokLen )) && !ForbidCheck() ) {
  16.     
  17.         memcpy( clType, clName, 3 );
  18.         clType[3] = 0;
  19.         clName += 3;
  20.     
  21.         String VarName( Tok, TokLen );
  22.         
  23.         rn = cd ? cd->rep.Check( (char*)VarName, 0 ) : 0;
  24.         if( !rn ) rn = reppar.Check( (char*)VarName, 0 );
  25.         if( !rn ) rn = (char*)VarName;
  26.         
  27.         StartSurvey();
  28.         
  29.         GetToken();
  30.         if( !TokLen ) return -1;
  31.         
  32.         short isref = (TokLen == 2 && !strncmp( Tok, "->", 2 ));
  33.         
  34.         StopSurvey();
  35.         
  36.         if( isref ) {
  37.         
  38.             StopCopy();
  39.         
  40.             GetToken();
  41.             if( !TokLen ) return -1;
  42.  
  43.             GetToken();
  44.             if( !TokLen ) return -1;
  45.  
  46.             if( TokType != ALN ) {
  47.                 Error( 4 );
  48.                 return -1;
  49.             }
  50.             
  51.             String MetAttr;
  52.             
  53.             short i;
  54.             for( i = 0; (i < TokLen) && (Tok[i] != '_'); i++ );
  55.             
  56.             if( Tok[i] != '_' ) {
  57.                 MetAttr = clName;;
  58.                 MetAttr += "_";
  59.                 String ps( Tok, TokLen );
  60.                 MetAttr += (char*)ps;
  61.             } else {
  62.                 i = i ? 0 : 1;
  63.                 MetAttr.Copy( Tok + i, TokLen - i );
  64.             }
  65.  
  66.             short CLevel = CBracket;
  67.  
  68.             GetToken();
  69.             if( !TokLen ) return -1;
  70.             
  71.             if( chcmp( '(' ) ) {
  72.  
  73.                 fprintf( ofh, "DoMethod( %s, %sM_%s", rn, clType, (char*)MetAttr );
  74.             
  75.                 StartCopy();
  76.                 
  77.                 short first = 1;
  78.                 
  79.                 while( 1 ) {
  80.  
  81.                     GetToken();
  82.                     if( !TokLen ) return -1;
  83.  
  84.                     if( chcmp( ')' ) && CBracket == CLevel ) break;
  85.                     if( first ) { first = 0; fprintf( ofh, ", " ); }
  86.  
  87.                     short rcr;
  88.                     rcr = FullCheck( );
  89.                     if( rcr == -1 ) return -1;
  90.                 
  91.                     if( chcmp( ')' ) && CBracket == CLevel ) break;
  92.                     
  93.                 }
  94.                 
  95.     
  96.                 return 1;
  97.             }
  98.  
  99.             if( chcmp( '=' ) ) {
  100.  
  101.                 fprintf( ofh, "BCC_Set( %s, %sA_%s, ",  rn, clType, (char*)MetAttr );
  102.                 StartCopy();
  103.  
  104.                 while( 1 ) {
  105.  
  106.                     GetToken();
  107.                     if( !TokLen ) return -1;
  108.  
  109.                     short rcr;
  110.                     rcr = FullCheck( );
  111.                     if( rcr == -1 ) return -1;
  112.                 
  113.                     if( chcmp( ';' ) ) break;
  114.  
  115.                 }
  116.                 
  117.                 StopCopy();
  118.                 fprintf( ofh, " );" );
  119.                 StartCopy();
  120.                 
  121.                 return 1;
  122.             }
  123.                 
  124.  
  125.             fprintf( ofh, "BCC_XGet( %s, %sA_%s )", rn, clType, (char*)MetAttr );
  126.             FastStartCopy();
  127.                     
  128.             return 1;
  129.                 
  130.         } else {
  131.             return 0;
  132.         }
  133.         
  134.     }
  135.   
  136.   return 0;
  137. }
  138.  
  139.  
  140. short ParseFile::ClassPtrDefinition( Replace *rep, short write, short once )
  141. {
  142.  
  143.     SetCType( write );
  144.     
  145.     switch( crcont ) {
  146.         case 0:
  147.             if( (TokLen == 5) && !strncmp( Tok, "Class", 5 ) && !ForbidCheck()) {
  148.  
  149.                 if( write ) {
  150.                     StopCopy();
  151.                     StartCopy();
  152.                     fprintf( ofh, "Object" );
  153.                 }
  154.                 
  155.                 crcont = 1;
  156.                 
  157.                 return 1;
  158.  
  159.             }
  160.             
  161.             break;
  162.         
  163.         case 1:
  164.         
  165.             if( TokType != ALN ) {
  166.                 Error( 18 );
  167.                 return -1;
  168.             }
  169.  
  170.             if( write ) {
  171.                 StopCopy();
  172.                 StartCopy();
  173.             }
  174.         
  175.             strcpy( crClName, ctype );
  176.             memcpy( crClName+3, Tok, TokLen );
  177.             crClName[TokLen+3] = 0;
  178.  
  179.             crcont = 2;
  180.  
  181.             return 1;
  182.             
  183.         case 2:
  184.                 
  185.             if( !chcmp( '*' ) ) {
  186.                 Error( 15 );
  187.                 return -1;
  188.             }
  189.             
  190.             crcont = 3;
  191.             
  192.             return 1;
  193.             
  194.         case 3:
  195.  
  196.             if( TokType != ALN ) {
  197.                 Error( 4 );
  198.                 return -1;
  199.             }
  200.             
  201.             rep->Add( Tok, TokLen, crClName, 0 );
  202.             
  203.             if( once ) crcont = 0;
  204.             else crcont = 4;
  205.             
  206.             return 1;
  207.             
  208.         case 4:
  209.     
  210.             if( chcmp( ';' ) ) crcont = 0;
  211.             else {
  212.                 if( chcmp( ',' ) ) crcont = 2;
  213.                 else return -1;
  214.             }
  215.  
  216.             return 1;
  217.         
  218.     }
  219.     
  220.     return 0;
  221.  
  222.  
  223. }
  224.  
  225. void ParseFile::SetCType( short write )
  226. {
  227.     if( TokType == ALN && TokLen == 3 ) {
  228.         if( !strncmp( "MUI", Tok, 3 ) ) {
  229.                 ctype = "MUI";
  230.                 if( write ) { StopCopy();    StartCopy(); }
  231.                 return;
  232.         } else
  233.         if( !strncmp( "BOP", Tok, 3 ) ) {
  234.                 ctype = "BOP";
  235.                 if( write ) { StopCopy();    StartCopy(); }
  236.                 return;
  237.         } 
  238.     }
  239.     ctype = Prefs.deftype;
  240. }
  241.  
  242.